<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>

    const likeArr = {
        0: 12,
        1: 24,
        2: 38,
        3: 46,
        4: 15,
        length: 5,
        [Symbol.iterator]() {
            let index = 0;
            return {
                next: () => {
                    /* next 方法的返回值是一个对象 ，
                    1. 对象的 done 属性是用于标识是否 遍历完成了，true代表遍历完成；false 还没有
                    2. 对象的 value 属性是用于存储遍历的值
                     */
                    if (index < this.length) {
                        return {
                            done: false, // 代表遍历还没有完成
                            value: {
                                index,
                                value: this[index++]
                            }, // 通过下标索引获取对象的值
                        }
                    } else {
                        return {
                            done: true,
                            value: undefined,
                        }
                    }
                }
            }
        }
    }

    console.log('likeArr', likeArr);

    for (const item of likeArr) {
        console.log(item);
    }

    /* 可以完成 对象的遍历 
        1. 对象的属性

        2. 对象的数值

    */
    const obj = {
        id: 1,
        name: '张三',
        age: 23,
        [Symbol('唯一属性')]: '我是一个唯一值',
        [Symbol('sayFn')]() {
            console.log('我是一个方法');
        },
        [Symbol.iterator]() {
            // 完成迭代器功能
            let index = 0;
            const keys = Reflect.ownKeys(this); // 获取当前对象所有的属性key值（包含 Symbol类型）

            return {
                next: () => {
                    // 完成迭代器的功能
                    if (index < keys.length) {
                        const key = keys[index++]; // 属性 key 值
                        return {
                            done: false, // false 代表还没有遍历完成
                            // value: [key, this[key]], // 遍历出来的结果以数组组织。也可以使用对象组织
                            value: { key, value: this[key] }, // 遍历出来的结果以对象组织
                        }
                    } else {
                        return {
                            done: true,
                            value: undefined
                        }
                    }


                }

            }
        }
    };


    for (const item of obj) {
        console.log(item); // ['属性名', 属性值]
    }

</script>

</html>